package com.mate.cloud.redisson.service;

import jakarta.annotation.Resource;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ZSetOperations;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

/**
 * 标签查询服务
 * @author:         MI
 * @email:          448341911@qq.com
 * @createTime:     2025/8/19 10:13
 * @updateUser:     MI
 * @updateTime:     2025/8/19 10:13
 * @updateRemark:   修改内容
 * @version:        1.0
 */
@Service
public class TagQueryService {

    @Resource
    private RedisTemplate<String, String> redisTemplate;

    /**
     * 获取商品的所有标签
     * @param itemId 商品ID
     * @return 标签集合
     */
    public Set<String> getItemTags(String itemId) {
        String itemTagsKey = "item:" + itemId + ":tags";
        return redisTemplate.opsForSet().members(itemTagsKey);
    }

    /**
     * 获取具有指定标签的所有商品
     * @param tagName 标签名称
     * @return 商品ID集合
     */
    public Set<String> getItemsByTag(String tagName) {
        String tagKey = "tag:" + tagName;
        return redisTemplate.opsForSet().members(tagKey);
    }

    /**
     * 获取多个标签的交集商品（同时拥有这些标签的商品）
     * @param tags 标签集合
     * @return 商品ID集合
     */
    public Set<String> getItemsByAllTags(Set<String> tags) {
        List<String> tagKeys = tags.stream()
                .map(tag -> "tag:" + tag)
                .collect(Collectors.toList());

        String[] keysArray = tagKeys.toArray(new String[0]);
        return redisTemplate.opsForSet().intersect(List.of(keysArray));
    }

    /**
     * 获取热门标签排行榜
     * @param topN 返回前N个热门标签
     * @return 标签及分数集合
     */
    public Set<ZSetOperations.TypedTuple<String>> getHotTags(int topN) {
        String hotTagsKey = "tag:hot";
        return redisTemplate.opsForZSet().reverseRangeWithScores(hotTagsKey, 0, topN - 1);
    }
}
